#ifndef MULTI_H
#define MULTI_H

#include <iostream>
#include <string>
#include "DiccTrie.h"

using namespace std;

class MConj {
	
public:
	MConj();
	void mAgregar( string elem );
	void mAgregarN( string elem, int n );
	void mEliminar( string elem );
	bool mEsVacio( );
	bool mPertenece( string elem );
	int mCantidad( string elem );
	void mUnion( MConj M);
	//bool mTieneTodos( conj c );
	//iterMconj mCrearIter( MConj M );
	//bool mTieneProximo( iterMConj it);
	//string mProximo( iterMConj it);
private:
	DiccTrie<int> *estr;
};

MConj::MConj() {
	estr = new DiccTrie<int> ();
}
void MConj::mAgregar( string elem ){
	if(estr->esClave(elem)){
		this->estr->definir(elem,1);
	}else{
		this->estr->definir(elem, this->estr->obtener(elem)+1);
	}
}
void MConj::mAgregarN( string elem, int n ){
	if(this->estr->esClave(elem)){
		this->estr->definir(elem,n);
	}else{
		this->estr->definir(elem, this->estr->obtener(elem)+n);
	}
}

void MConj::mEliminar( string elem ){				
	//this->estr->borrar(elem);
}

bool MConj::mEsVacio( ){
	return estr->claves().vacio();
}

bool MConj::mPertenece( string elem ){
	return this->estr->esClave(elem);
}

int MConj::mCantidad( string elem ){
	if(this->estr->esClave(elem)){
		return this->estr->obtener(elem);
	}else{
		return 0;
	}
}

void MConj::mUnion( MConj M){
	/*it=M.mCrearIter();
	while( it.mTieneProximo() ){
		temp = it.mProximo()
		if(!this->estr->esClave(temp)){
			this->estr->definir(temp, M.obtener(temp));
		}else{
			this->estr->definir(temp, this->estr->obtener(temp) + M.obtener(temp));
		}
	}	*/
}

/*bool MConj::mTieneTodos( conj c ){
	/*it=c.cCrearIter();
	while( it.cTieneProximo() ){
		if(!this->estr.def(it.cProximo())){
			return false;
		}
	}
}*/
/*
iterMconj mCrearIter( ){
	return this->estr.iterDicc();
}

bool mTieneProximo( iterMConj it){
	return it.dTieneProximo();
}

string mProximo( iterMConj it){
	return it.dProximo();
}
*/
#endif
